import numpy as np
import pandas as pd
pd.options.display.max_colwidth = 300
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn import metrics
import re
RANDOM_SEED = 42
# !pip freeze > requirements.txt
# Анализ содержимого таблицы
def df_types(df_input):
df_output = pd.DataFrame(
df_input[df_input[c].notna()][c].apply(type).value_counts() for c in df_input.columns
).fillna(0).astype(int)
if df_input.isna().any().any():
df_output['NaN'] = df_input.isna().sum()
df_output['sum'] = df_output.sum(axis=1)
display(df_output.head(60))
# return df_output
df_melting_input = pd.read_excel('Исх9.xlsx', 'Параметры')
df_types(df_melting_input)
df_melting_input.columns
| <class 'int'> | <class 'pandas._libs.tslibs.timestamps.Timestamp'> | <class 'float'> | <class 'str'> | <class 'datetime.time'> | NaN | sum | |
|---|---|---|---|---|---|---|---|
| Паспорт разливки плавки | 24823 | 0 | 0 | 0 | 0 | 0 | 24823 |
| Дата | 0 | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Момент замера | 0 | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Минут между плавками | 0 | 0 | 24823 | 0 | 0 | 0 | 24823 |
| Вес заготовок, т | 0 | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Марка стали полученная | 0 | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Номер серии | 24823 | 0 | 0 | 0 | 0 | 0 | 24823 |
| Плавка в серии | 24823 | 0 | 0 | 0 | 0 | 0 | 24823 |
| Размер | 24823 | 0 | 0 | 0 | 0 | 0 | 24823 |
| Тип разливки | 0 | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Вес разлитой стали, т | 0 | 0 | 24823 | 0 | 0 | 0 | 24823 |
| Темп. стали в с/к, °C | 0 | 0 | 24820 | 0 | 0 | 3 | 24823 |
| Ручей | 24823 | 0 | 0 | 0 | 0 | 0 | 24823 |
| Стойкость, т | 24823 | 0 | 0 | 0 | 0 | 0 | 24823 |
| Ключ | 0 | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Номер запись в паспорте | 24823 | 0 | 0 | 0 | 0 | 0 | 24823 |
| Номер кристаллизатора | 24823 | 0 | 0 | 0 | 0 | 0 | 24823 |
| Гильза | 24060 | 0 | 0 | 763 | 0 | 0 | 24823 |
| Стойкость при выходе из строя, т | 24823 | 0 | 0 | 0 | 0 | 0 | 24823 |
| Стойкость при последней ревизии, т | 24823 | 0 | 0 | 0 | 0 | 0 | 24823 |
| Срок службы, в % от гарантии | 0 | 0 | 24823 | 0 | 0 | 0 | 24823 |
| Частота качания, кол-во/мин | 24823 | 0 | 0 | 0 | 0 | 0 | 24823 |
| Ход кр-ра, мм | 24823 | 0 | 0 | 0 | 0 | 0 | 24823 |
| Скорость разливки, м/мин | 24823 | 0 | 0 | 0 | 0 | 0 | 24823 |
| Расход воды на кр-р, л/мин | 24823 | 0 | 0 | 0 | 0 | 0 | 24823 |
| Дельта температуры воды, °C | 24823 | 0 | 0 | 0 | 0 | 0 | 24823 |
| Расход воды ЗВО №1, л/мин | 24823 | 0 | 0 | 0 | 0 | 0 | 24823 |
| Расход воды ЗВО №2, л/мин | 24823 | 0 | 0 | 0 | 0 | 0 | 24823 |
| Расход воды ЗВО №3, л/мин | 0 | 0 | 24813 | 0 | 0 | 10 | 24823 |
| Марка | 0 | 0 | 0 | 21801 | 0 | 3022 | 24823 |
| Кол-во, т | 0 | 0 | 0 | 21784 | 0 | 3039 | 24823 |
| Время 1 замера | 0 | 0 | 0 | 0 | 24823 | 0 | 24823 |
| Темп 1, °С | 0 | 0 | 24790 | 0 | 0 | 33 | 24823 |
| Время 2 замера | 0 | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Темп 2, °С | 0 | 0 | 24790 | 0 | 0 | 33 | 24823 |
| Время пробы МНЛЗ | 0 | 0 | 0 | 24823 | 0 | 0 | 24823 |
| C, % | 0 | 0 | 24823 | 0 | 0 | 0 | 24823 |
| Si, % | 0 | 0 | 24823 | 0 | 0 | 0 | 24823 |
| Mn,% | 0 | 0 | 24823 | 0 | 0 | 0 | 24823 |
| S, % | 0 | 0 | 24823 | 0 | 0 | 0 | 24823 |
| P, % | 0 | 0 | 24823 | 0 | 0 | 0 | 24823 |
| Cr, % | 0 | 0 | 24823 | 0 | 0 | 0 | 24823 |
| Ni, % | 0 | 0 | 24823 | 0 | 0 | 0 | 24823 |
| Cu, % | 0 | 0 | 24823 | 0 | 0 | 0 | 24823 |
| As, % | 0 | 0 | 24811 | 0 | 0 | 12 | 24823 |
| Mo, % | 0 | 0 | 24817 | 0 | 0 | 6 | 24823 |
| Nb, % | 0 | 0 | 24811 | 0 | 0 | 12 | 24823 |
| Sn, % | 0 | 0 | 2552 | 0 | 0 | 22271 | 24823 |
| Ti, % | 0 | 0 | 24811 | 0 | 0 | 12 | 24823 |
| V, % | 0 | 0 | 24823 | 0 | 0 | 0 | 24823 |
| Al, % | 0 | 0 | 24823 | 0 | 0 | 0 | 24823 |
| Ca, % | 0 | 0 | 24823 | 0 | 0 | 0 | 24823 |
| N, % | 0 | 0 | 24823 | 0 | 0 | 0 | 24823 |
| Pb, % | 0 | 0 | 19236 | 0 | 0 | 5587 | 24823 |
| Mg, % | 0 | 0 | 15718 | 0 | 0 | 9105 | 24823 |
| Zn, % | 0 | 0 | 11809 | 0 | 0 | 13014 | 24823 |
| Сэ, % | 0 | 0 | 14644 | 0 | 0 | 10179 | 24823 |
| Тип стакана дозатора п/к | 0 | 0 | 0 | 24812 | 0 | 11 | 24823 |
| № НЛЗ | 24823 | 0 | 0 | 0 | 0 | 0 | 24823 |
| Ромбичность, мм | 24823 | 0 | 0 | 0 | 0 | 0 | 24823 |
Index(['Паспорт разливки плавки', 'Дата', 'Момент замера',
'Минут между плавками', 'Вес заготовок, т', 'Марка стали полученная',
'Номер серии', 'Плавка в серии', 'Размер', 'Тип разливки',
'Вес разлитой стали, т', 'Темп. стали в с/к, °C', 'Ручей',
'Стойкость, т', 'Ключ', 'Номер запись в паспорте',
'Номер кристаллизатора', 'Гильза', 'Стойкость при выходе из строя, т',
'Стойкость при последней ревизии, т', 'Срок службы, в % от гарантии',
'Частота качания, кол-во/мин', 'Ход кр-ра, мм',
'Скорость разливки, м/мин', 'Расход воды на кр-р, л/мин',
'Дельта температуры воды, °C', 'Расход воды ЗВО №1, л/мин',
'Расход воды ЗВО №2, л/мин', 'Расход воды ЗВО №3, л/мин', 'Марка',
'Кол-во, т', 'Время 1 замера', 'Темп 1, °С', 'Время 2 замера',
'Темп 2, °С', 'Время пробы МНЛЗ', 'C, %', 'Si, %', 'Mn,%', 'S, %',
'P, %', 'Cr, %', 'Ni, %', 'Cu, %', 'As, %', 'Mo, %', 'Nb, %', 'Sn, %',
'Ti, %', 'V, %', 'Al, %', 'Ca, %', 'N, %', 'Pb, %', 'Mg, %', 'Zn, %',
'Сэ, %', 'Тип стакана дозатора п/к', '№ НЛЗ', 'Ромбичность, мм',
'дельта'],
dtype='object')
df_melting = df_melting_input.copy().reset_index(drop=True)
gil_list = df_melting["Гильза"]
df_melting["Вес заготовок, т"] = df_melting["Вес заготовок, т"].str.replace(',','.').astype(float)
df_melting["Кол-во, т"] = df_melting["Кол-во, т"].str.replace(',','.').astype(float)
df_melting["Марка"], marka_list = df_melting["Марка"].factorize()
df_melting["Марка стали полученная"], marka_st_list = df_melting["Марка стали полученная"].factorize()
df_melting.fillna(0, inplace=True)
df_types(df_melting)
df_melting.columns
| <class 'int'> | <class 'pandas._libs.tslibs.timestamps.Timestamp'> | <class 'float'> | <class 'str'> | <class 'datetime.time'> | sum | |
|---|---|---|---|---|---|---|
| Паспорт разливки плавки | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Дата | 0 | 24823 | 0 | 0 | 0 | 24823 |
| Момент замера | 0 | 24823 | 0 | 0 | 0 | 24823 |
| Минут между плавками | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Вес заготовок, т | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Марка стали полученная | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Номер серии | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Плавка в серии | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Размер | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Тип разливки | 0 | 0 | 0 | 24823 | 0 | 24823 |
| Вес разлитой стали, т | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Темп. стали в с/к, °C | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Ручей | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Стойкость, т | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Ключ | 0 | 0 | 0 | 24823 | 0 | 24823 |
| Номер запись в паспорте | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Номер кристаллизатора | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Гильза | 24060 | 0 | 0 | 763 | 0 | 24823 |
| Стойкость при выходе из строя, т | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Стойкость при последней ревизии, т | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Срок службы, в % от гарантии | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Частота качания, кол-во/мин | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Ход кр-ра, мм | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Скорость разливки, м/мин | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Расход воды на кр-р, л/мин | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Дельта температуры воды, °C | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Расход воды ЗВО №1, л/мин | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Расход воды ЗВО №2, л/мин | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Расход воды ЗВО №3, л/мин | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Марка | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Кол-во, т | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Время 1 замера | 0 | 0 | 0 | 0 | 24823 | 24823 |
| Темп 1, °С | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Время 2 замера | 0 | 0 | 0 | 24823 | 0 | 24823 |
| Темп 2, °С | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Время пробы МНЛЗ | 0 | 0 | 0 | 24823 | 0 | 24823 |
| C, % | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Si, % | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Mn,% | 0 | 0 | 24823 | 0 | 0 | 24823 |
| S, % | 0 | 0 | 24823 | 0 | 0 | 24823 |
| P, % | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Cr, % | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Ni, % | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Cu, % | 0 | 0 | 24823 | 0 | 0 | 24823 |
| As, % | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Mo, % | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Nb, % | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Sn, % | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Ti, % | 0 | 0 | 24823 | 0 | 0 | 24823 |
| V, % | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Al, % | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Ca, % | 0 | 0 | 24823 | 0 | 0 | 24823 |
| N, % | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Pb, % | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Mg, % | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Zn, % | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Сэ, % | 0 | 0 | 24823 | 0 | 0 | 24823 |
| Тип стакана дозатора п/к | 11 | 0 | 0 | 24812 | 0 | 24823 |
| № НЛЗ | 24823 | 0 | 0 | 0 | 0 | 24823 |
| Ромбичность, мм | 24823 | 0 | 0 | 0 | 0 | 24823 |
Index(['Паспорт разливки плавки', 'Дата', 'Момент замера',
'Минут между плавками', 'Вес заготовок, т', 'Марка стали полученная',
'Номер серии', 'Плавка в серии', 'Размер', 'Тип разливки',
'Вес разлитой стали, т', 'Темп. стали в с/к, °C', 'Ручей',
'Стойкость, т', 'Ключ', 'Номер запись в паспорте',
'Номер кристаллизатора', 'Гильза', 'Стойкость при выходе из строя, т',
'Стойкость при последней ревизии, т', 'Срок службы, в % от гарантии',
'Частота качания, кол-во/мин', 'Ход кр-ра, мм',
'Скорость разливки, м/мин', 'Расход воды на кр-р, л/мин',
'Дельта температуры воды, °C', 'Расход воды ЗВО №1, л/мин',
'Расход воды ЗВО №2, л/мин', 'Расход воды ЗВО №3, л/мин', 'Марка',
'Кол-во, т', 'Время 1 замера', 'Темп 1, °С', 'Время 2 замера',
'Темп 2, °С', 'Время пробы МНЛЗ', 'C, %', 'Si, %', 'Mn,%', 'S, %',
'P, %', 'Cr, %', 'Ni, %', 'Cu, %', 'As, %', 'Mo, %', 'Nb, %', 'Sn, %',
'Ti, %', 'V, %', 'Al, %', 'Ca, %', 'N, %', 'Pb, %', 'Mg, %', 'Zn, %',
'Сэ, %', 'Тип стакана дозатора п/к', '№ НЛЗ', 'Ромбичность, мм',
'дельта'],
dtype='object')
object_columns = [s for s in df_melting.columns if df_melting[s].dtypes == 'object']
object_columns += ['Дата', 'Момент замера', 'Паспорт разливки плавки', 'Стойкость, т', '№ НЛЗ',
'Номер серии', 'Номер запись в паспорте', 'Срок службы, в % от гарантии', 'Стойкость при выходе из строя, т']
df_melting.drop(object_columns, axis = 1, inplace=True)
df_types(df_melting)
| <class 'float'> | <class 'int'> | sum | |
|---|---|---|---|
| Минут между плавками | 24823 | 0 | 24823 |
| Вес заготовок, т | 24823 | 0 | 24823 |
| Марка стали полученная | 0 | 24823 | 24823 |
| Плавка в серии | 0 | 24823 | 24823 |
| Размер | 0 | 24823 | 24823 |
| Вес разлитой стали, т | 24823 | 0 | 24823 |
| Темп. стали в с/к, °C | 24823 | 0 | 24823 |
| Ручей | 0 | 24823 | 24823 |
| Номер кристаллизатора | 0 | 24823 | 24823 |
| Стойкость при последней ревизии, т | 0 | 24823 | 24823 |
| Частота качания, кол-во/мин | 0 | 24823 | 24823 |
| Ход кр-ра, мм | 0 | 24823 | 24823 |
| Скорость разливки, м/мин | 0 | 24823 | 24823 |
| Расход воды на кр-р, л/мин | 0 | 24823 | 24823 |
| Дельта температуры воды, °C | 0 | 24823 | 24823 |
| Расход воды ЗВО №1, л/мин | 0 | 24823 | 24823 |
| Расход воды ЗВО №2, л/мин | 0 | 24823 | 24823 |
| Расход воды ЗВО №3, л/мин | 24823 | 0 | 24823 |
| Марка | 0 | 24823 | 24823 |
| Кол-во, т | 24823 | 0 | 24823 |
| Темп 1, °С | 24823 | 0 | 24823 |
| Темп 2, °С | 24823 | 0 | 24823 |
| C, % | 24823 | 0 | 24823 |
| Si, % | 24823 | 0 | 24823 |
| Mn,% | 24823 | 0 | 24823 |
| S, % | 24823 | 0 | 24823 |
| P, % | 24823 | 0 | 24823 |
| Cr, % | 24823 | 0 | 24823 |
| Ni, % | 24823 | 0 | 24823 |
| Cu, % | 24823 | 0 | 24823 |
| As, % | 24823 | 0 | 24823 |
| Mo, % | 24823 | 0 | 24823 |
| Nb, % | 24823 | 0 | 24823 |
| Sn, % | 24823 | 0 | 24823 |
| Ti, % | 24823 | 0 | 24823 |
| V, % | 24823 | 0 | 24823 |
| Al, % | 24823 | 0 | 24823 |
| Ca, % | 24823 | 0 | 24823 |
| N, % | 24823 | 0 | 24823 |
| Pb, % | 24823 | 0 | 24823 |
| Mg, % | 24823 | 0 | 24823 |
| Zn, % | 24823 | 0 | 24823 |
| Сэ, % | 24823 | 0 | 24823 |
| Ромбичность, мм | 0 | 24823 | 24823 |
| дельта | 0 | 24823 | 24823 |
# df_melting.to_clipboard()
df = df_melting.copy().reset_index(drop=True)
key_param = 'Стойкость при последней ревизии, т'
# Для понимания значимости зависимости сгенерируем три случайные параметра
df['random'] = np.random.rand(len(df))
df['random_10'] = np.random.rand(len(df))*10000
df['random_sec'] = list(range(len(df)))
df['random_sec'] = df['random_sec'].sample(frac=1).reset_index(drop=True)
plt.rcParams['xtick.top'] = plt.rcParams['xtick.labeltop'] = True
plt.rcParams['xtick.bottom'] = plt.rcParams['xtick.labelbottom'] = False
plt.figure(figsize=(16,10), dpi= 100)
df_corr = df[[key_param]+[c for c in df.columns if not c in [key_param]]].corr()
sns.heatmap(df_corr.abs(), cmap='Reds', square=True)
plt.xticks(horizontalalignment='left', fontsize=8, rotation=45)
plt.yticks(fontsize=8);
plt.figure(figsize=(16,10), dpi= 100)
df_corr = df[[key_param]+[c for c in df.columns[:len(df.columns)//3] if not c in [key_param]]].corr()
sns.heatmap(df_corr.abs(), annot=True, fmt='.2f', annot_kws={'fontsize':14}, cmap='Reds', linewidths=1)
#, mask=np.triu(df_corr)) colors — https://matplotlib.org/examples/color/colormaps_reference.html
plt.xticks(horizontalalignment='left', fontweight='light', fontsize=14, rotation=30)
plt.yticks(fontweight='light', fontsize=14);
plt.figure(figsize=(16,10), dpi= 100)
df_corr = df[[key_param]+[c for c in df.columns[len(df.columns)//3:len(df.columns)//3*2] if not c in [key_param]]].corr()
sns.heatmap(df_corr.abs(), annot=True, fmt='.2f', annot_kws={'fontsize':14}, cmap='Reds', linewidths=1)
#, mask=np.triu(df_corr)) colors — https://matplotlib.org/examples/color/colormaps_reference.html
plt.xticks(horizontalalignment='left', fontweight='light', fontsize=14, rotation=30)
plt.yticks(fontweight='light', fontsize=14);
plt.figure(figsize=(16,10), dpi= 100)
df_corr = df[[key_param]+[c for c in df.columns[len(df.columns)//3*2:] if not c in [key_param]]].corr()
sns.heatmap(df_corr.abs(), annot=True, fmt='.2f', annot_kws={'fontsize':14}, cmap='Reds', linewidths=1)
#, mask=np.triu(df_corr)) colors — https://matplotlib.org/examples/color/colormaps_reference.html
plt.xticks(horizontalalignment='left', fontweight='light', fontsize=14, rotation=30)
plt.yticks(fontweight='light', fontsize=14);
# df_melting.to_clipboard()
df = df_melting.copy()[df_melting['Размер']==150].drop('Размер', axis = 1).reset_index(drop=True)
key_param = 'Стойкость при последней ревизии, т'
# Для понимания значимости зависимости сгенерируем три случайные параметра
df['random'] = np.random.rand(len(df))
df['random_10'] = np.random.rand(len(df))*10000
df['random_sec'] = list(range(len(df)))
df['random_sec'] = df['random_sec'].sample(frac=1).reset_index(drop=True)
plt.rcParams['xtick.top'] = plt.rcParams['xtick.labeltop'] = True
plt.rcParams['xtick.bottom'] = plt.rcParams['xtick.labelbottom'] = False
plt.figure(figsize=(16,10), dpi= 100)
df_corr = df[[key_param]+[c for c in df.columns if not c in [key_param]]].corr()
sns.heatmap(df_corr.abs(), cmap='Reds', square=True)
plt.xticks(horizontalalignment='left', fontsize=8, rotation=45)
plt.yticks(fontsize=8);
plt.figure(figsize=(16,10), dpi= 100)
df_corr = df[[key_param]+[c for c in df.columns[:len(df.columns)//3] if not c in [key_param]]].corr()
sns.heatmap(df_corr.abs(), annot=True, fmt='.2f', annot_kws={'fontsize':14}, cmap='Reds', linewidths=1)
#, mask=np.triu(df_corr)) colors — https://matplotlib.org/examples/color/colormaps_reference.html
plt.xticks(horizontalalignment='left', fontweight='light', fontsize=14, rotation=30)
plt.yticks(fontweight='light', fontsize=14);
plt.figure(figsize=(16,10), dpi= 100)
df_corr = df[[key_param]+[c for c in df.columns[len(df.columns)//3:len(df.columns)//3*2] if not c in [key_param]]].corr()
sns.heatmap(df_corr.abs(), annot=True, fmt='.2f', annot_kws={'fontsize':14}, cmap='Reds', linewidths=1)
#, mask=np.triu(df_corr)) colors — https://matplotlib.org/examples/color/colormaps_reference.html
plt.xticks(horizontalalignment='left', fontweight='light', fontsize=14, rotation=30)
plt.yticks(fontweight='light', fontsize=14);
plt.figure(figsize=(16,10), dpi= 100)
df_corr = df[[key_param]+[c for c in df.columns[len(df.columns)//3*2:] if not c in [key_param]]].corr()
sns.heatmap(df_corr.abs(), annot=True, fmt='.2f', annot_kws={'fontsize':14}, cmap='Reds', linewidths=1)
#, mask=np.triu(df_corr)) colors — https://matplotlib.org/examples/color/colormaps_reference.html
plt.xticks(horizontalalignment='left', fontweight='light', fontsize=14, rotation=30)
plt.yticks(fontweight='light', fontsize=14);
# df_melting.to_clipboard()
df = df_melting.copy()[df_melting['Размер']==180].drop('Размер', axis = 1).reset_index(drop=True)
key_param = 'Стойкость при последней ревизии, т'
# Для понимания значимости зависимости сгенерируем три случайные параметра
df['random'] = np.random.rand(len(df))
df['random_10'] = np.random.rand(len(df))*10000
df['random_sec'] = list(range(len(df)))
df['random_sec'] = df['random_sec'].sample(frac=1).reset_index(drop=True)
plt.rcParams['xtick.top'] = plt.rcParams['xtick.labeltop'] = True
plt.rcParams['xtick.bottom'] = plt.rcParams['xtick.labelbottom'] = False
plt.figure(figsize=(16,10), dpi= 100)
df_corr = df[[key_param]+[c for c in df.columns if not c in [key_param]]].corr()
sns.heatmap(df_corr.abs(), cmap='Reds', square=True)
plt.xticks(horizontalalignment='left', fontsize=8, rotation=45)
plt.yticks(fontsize=8);
plt.figure(figsize=(16,10), dpi= 100)
df_corr = df[[key_param]+[c for c in df.columns[:len(df.columns)//3] if not c in [key_param]]].corr()
sns.heatmap(df_corr.abs(), annot=True, fmt='.2f', annot_kws={'fontsize':14}, cmap='Reds', linewidths=1)
#, mask=np.triu(df_corr)) colors — https://matplotlib.org/examples/color/colormaps_reference.html
plt.xticks(horizontalalignment='left', fontweight='light', fontsize=14, rotation=30)
plt.yticks(fontweight='light', fontsize=14);
plt.figure(figsize=(16,10), dpi= 100)
df_corr = df[[key_param]+[c for c in df.columns[len(df.columns)//3:len(df.columns)//3*2] if not c in [key_param]]].corr()
sns.heatmap(df_corr.abs(), annot=True, fmt='.2f', annot_kws={'fontsize':14}, cmap='Reds', linewidths=1)
#, mask=np.triu(df_corr)) colors — https://matplotlib.org/examples/color/colormaps_reference.html
plt.xticks(horizontalalignment='left', fontweight='light', fontsize=14, rotation=30)
plt.yticks(fontweight='light', fontsize=14);
plt.figure(figsize=(16,10), dpi= 100)
df_corr = df[[key_param]+[c for c in df.columns[len(df.columns)//3*2:] if not c in [key_param]]].corr()
sns.heatmap(df_corr.abs(), annot=True, fmt='.2f', annot_kws={'fontsize':14}, cmap='Reds', linewidths=1)
#, mask=np.triu(df_corr)) colors — https://matplotlib.org/examples/color/colormaps_reference.html
plt.xticks(horizontalalignment='left', fontweight='light', fontsize=14, rotation=30)
plt.yticks(fontweight='light', fontsize=14);
# разобъем список гильз gil_list.unique() на трен и тест
# выделим 40% гильз на валидацию (параметр test_size)
gil_train, gil_test = train_test_split(gil_list.unique(), test_size=0.4, random_state=RANDOM_SEED)
y_train = df_melting[gil_list.isin(gil_train)]['Стойкость при последней ревизии, т'].values
X_train = df_melting[gil_list.isin(gil_train)].drop('Стойкость при последней ревизии, т', axis=1)
y_test = df_melting[gil_list.isin(gil_test)]['Стойкость при последней ревизии, т'].values
X_test = df_melting[gil_list.isin(gil_test)].drop('Стойкость при последней ревизии, т', axis=1)
len(gil_train), len(gil_test), len(y_train), len(X_train), len(y_test), len(X_test)
(36, 25, 12483, 12483, 12340, 12340)
# Создаём модель, используя модель Random forest
model = RandomForestRegressor(n_estimators=200, verbose=1, n_jobs=-1, random_state=RANDOM_SEED)
# Обучаем модель на тестовом наборе данных
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
[Parallel(n_jobs=-1)]: Using backend ThreadingBackend with 8 concurrent workers. [Parallel(n_jobs=-1)]: Done 34 tasks | elapsed: 9.6s [Parallel(n_jobs=-1)]: Done 184 tasks | elapsed: 43.7s [Parallel(n_jobs=-1)]: Done 200 out of 200 | elapsed: 47.4s finished [Parallel(n_jobs=8)]: Using backend ThreadingBackend with 8 concurrent workers. [Parallel(n_jobs=8)]: Done 34 tasks | elapsed: 0.1s [Parallel(n_jobs=8)]: Done 184 tasks | elapsed: 0.6s [Parallel(n_jobs=8)]: Done 200 out of 200 | elapsed: 0.6s finished
mae = metrics.mean_absolute_error(y_test,y_pred)
mean = df['Стойкость при последней ревизии, т'].mean()
mae_percent = mae/mean
print('среднее количество метала до выбытия:', mean)
print('средняя ошибка прогноза: ', mae)
print('средняя ошибка в %:', mae_percent*100, '%')
среднее количество метала до выбытия: 10559.360437384692 средняя ошибка прогноза: 3327.866823338736 средняя ошибка в %: 31.51579911560412 %
# RandomForestRegressor — выведем самые важные признаки
plt.rcParams['figure.figsize'] = (12,10)
feat_importances = pd.Series(model.feature_importances_, index=X_test.columns)
feat_importances.nlargest(60).plot(kind='barh')
<AxesSubplot:>
# разобъем список гильз gil_list.unique() на трен и тест
# выделим 40% гильз на валидацию (параметр test_size)
gil_train, gil_test = train_test_split(gil_list.unique(), test_size=0.4, random_state=RANDOM_SEED)
y_train = df_melting[(df_melting['Размер']==150)&gil_list.isin(gil_train)]['Стойкость при последней ревизии, т'].values
X_train = df_melting[(df_melting['Размер']==150)&gil_list.isin(gil_train)].drop('Стойкость при последней ревизии, т', axis=1)
y_test = df_melting[(df_melting['Размер']==150)&gil_list.isin(gil_test)]['Стойкость при последней ревизии, т'].values
X_test = df_melting[(df_melting['Размер']==150)&gil_list.isin(gil_test)].drop('Стойкость при последней ревизии, т', axis=1)
len(gil_train), len(gil_test), len(y_train), len(X_train), len(y_test), len(X_test)
(36, 25, 1324, 1324, 1276, 1276)
# Создаём модель, используя модель Random forest
model = RandomForestRegressor(n_estimators=200, verbose=1, n_jobs=-1, random_state=RANDOM_SEED)
# Обучаем модель на тестовом наборе данных
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
[Parallel(n_jobs=-1)]: Using backend ThreadingBackend with 8 concurrent workers. [Parallel(n_jobs=-1)]: Done 34 tasks | elapsed: 0.2s [Parallel(n_jobs=-1)]: Done 184 tasks | elapsed: 2.2s [Parallel(n_jobs=-1)]: Done 200 out of 200 | elapsed: 2.3s finished [Parallel(n_jobs=8)]: Using backend ThreadingBackend with 8 concurrent workers. [Parallel(n_jobs=8)]: Done 34 tasks | elapsed: 0.0s [Parallel(n_jobs=8)]: Done 184 tasks | elapsed: 0.0s [Parallel(n_jobs=8)]: Done 200 out of 200 | elapsed: 0.0s finished
mae = metrics.mean_absolute_error(y_test,y_pred)
mean = df['Стойкость при последней ревизии, т'].mean()
mae_percent = mae/mean
print('среднее количество метала до выбытия:', mean)
print('средняя ошибка прогноза: ', mae)
print('средняя ошибка в %:', mae_percent*100, '%')
среднее количество метала до выбытия: 10559.360437384692 средняя ошибка прогноза: 1430.407789968652 средняя ошибка в %: 13.546348743853759 %
# RandomForestRegressor — выведем самые важные признаки
plt.rcParams['figure.figsize'] = (12,10)
feat_importances = pd.Series(model.feature_importances_, index=X_test.columns)
feat_importances.nlargest(15).plot(kind='barh')
<AxesSubplot:>
# разобъем список гильз gil_list.unique() на трен и тест
# выделим 40% гильз на валидацию (параметр test_size)
gil_train, gil_test = train_test_split(gil_list.unique(), test_size=0.4, random_state=RANDOM_SEED)
y_train = df_melting[(df_melting['Размер']==180)&gil_list.isin(gil_train)]['Стойкость при последней ревизии, т'].values
X_train = df_melting[(df_melting['Размер']==180)&gil_list.isin(gil_train)].drop('Стойкость при последней ревизии, т', axis=1)
y_test = df_melting[(df_melting['Размер']==180)&gil_list.isin(gil_test)]['Стойкость при последней ревизии, т'].values
X_test = df_melting[(df_melting['Размер']==180)&gil_list.isin(gil_test)].drop('Стойкость при последней ревизии, т', axis=1)
len(gil_train), len(gil_test), len(y_train), len(X_train), len(y_test), len(X_test)
(36, 25, 11159, 11159, 11064, 11064)
# Создаём модель, используя модель Random forest
model = RandomForestRegressor(n_estimators=200, verbose=1, n_jobs=-1, random_state=RANDOM_SEED)
# Обучаем модель на тестовом наборе данных
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
[Parallel(n_jobs=-1)]: Using backend ThreadingBackend with 8 concurrent workers. [Parallel(n_jobs=-1)]: Done 34 tasks | elapsed: 0.1s [Parallel(n_jobs=-1)]: Done 184 tasks | elapsed: 1.6s [Parallel(n_jobs=-1)]: Done 200 out of 200 | elapsed: 1.7s finished [Parallel(n_jobs=8)]: Using backend ThreadingBackend with 8 concurrent workers. [Parallel(n_jobs=8)]: Done 34 tasks | elapsed: 0.0s [Parallel(n_jobs=8)]: Done 184 tasks | elapsed: 0.0s [Parallel(n_jobs=8)]: Done 200 out of 200 | elapsed: 0.0s finished
mae = metrics.mean_absolute_error(y_test,y_pred)
mean = df['Стойкость при последней ревизии, т'].mean()
mae_percent = mae/mean
print('среднее количество метала до выбытия:', mean)
print('средняя ошибка прогноза: ', mae)
print('средняя ошибка в %:', mae_percent*100, '%')
среднее количество метала до выбытия: 10559.360437384692 средняя ошибка прогноза: 1430.407789968652 средняя ошибка в %: 13.546348743853759 %
# RandomForestRegressor — выведем самые важные признаки
plt.rcParams['figure.figsize'] = (12,10)
feat_importances = pd.Series(model.feature_importances_, index=X_test.columns)
feat_importances.nlargest(15).plot(kind='barh')
<AxesSubplot:>
# Разбиваем набор данных на тренировочный и тестовый
y = df_melting['Стойкость при последней ревизии, т'].values
X = df_melting.drop('Стойкость при последней ревизии, т', axis=1)
# Воспользуемся специальной функцие train_test_split для разбивки тестовых данных
# выделим 40% гильз на валидацию (параметр test_size)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=RANDOM_SEED)
# Создаём модель, используя метод Random forest
model = RandomForestRegressor(n_estimators=100, verbose=1, n_jobs=-1, random_state=RANDOM_SEED)
# Обучаем модель на тестовом наборе данных
model.fit(X_train, y_train)
# Используем обученную модель для предсказания рейтинга ресторанов в тестовой выборке.
# Предсказанные значения записываем в переменную y_pred
y_pred = model.predict(X_test)
[Parallel(n_jobs=-1)]: Using backend ThreadingBackend with 8 concurrent workers. [Parallel(n_jobs=-1)]: Done 34 tasks | elapsed: 8.9s [Parallel(n_jobs=-1)]: Done 100 out of 100 | elapsed: 22.5s finished [Parallel(n_jobs=8)]: Using backend ThreadingBackend with 8 concurrent workers. [Parallel(n_jobs=8)]: Done 34 tasks | elapsed: 0.2s [Parallel(n_jobs=8)]: Done 100 out of 100 | elapsed: 0.6s finished
mae = metrics.mean_absolute_error(y_test,y_pred)
mean = df['Стойкость при последней ревизии, т'].mean()
mae_percent = mae/mean
print('среднее количество метала до выбытия:', mean)
print('средняя ошибка прогноза: ', mae)
print('средняя ошибка в %:', mae_percent*100, '%')
среднее количество метала до выбытия: 10559.360437384692 средняя ошибка прогноза: 48.52522255790533 средняя ошибка в %: 0.45954698530893123 %
# в RandomForestRegressor есть возможность вывести самые важные признаки для модели
plt.rcParams['figure.figsize'] = (12,10)
feat_importances = pd.Series(model.feature_importances_, index=X.columns)
feat_importances.nlargest(15).plot(kind='barh')
<AxesSubplot:>